/*---------------------------------------------------------
 * Arquivo: arquivo_utils.c - implementação de funções 
 * para manipulação de arquivos contendo dados do tipo
 * float e complexo
 * 
 * Programa: fft-2d paralela
 * Versão: 0.6.1
 *---------------------------------------------------------
 * */
 
 
#include "arquivo_utils.h"
#include "matriz_utils.h"


/**
 * @brief Lê algumas linhas da matriz contida no arquivo e retorna uma matriz de floats
 * @param l Total de linhas da matriz
 * @param c Total de colunas da matriz 
 * @param ind_relat Índice a partir do qual a matriz será lida, deve ser maior que zero
 * @param qtde_linhas Total de linhas da matriz do arquivo a serem lidas
 * @param nome_arquivo Nome do arquivo a ser lido
 * @author LidianyCS
 */
float **ler_linhas_arquivo(int l, int c, int ind_relat, int qtde_linhas, char *nome_arquivo){
	FILE *arquivo;
	
	float **matriz;
	
	matriz = alocar_matriz(qtde_linhas, c);
	
	arquivo = fopen(nome_arquivo,"rb");
	
	if(arquivo == NULL)
      {
        printf("Erro: não foi possível abrir o arquivo para leitura");
        exit(1);
      }        
	/*
	 * posiciona o cursor de acordo com o número de colunas e com 
	 * o indice relativo da matriz, dessa forma a matriz não é lida por 
	 * completo, apenas uma parte dela
	*/
	if(ind_relat > 0){
		fseek(arquivo, (ind_relat * c) * ( sizeof(float) ), SEEK_SET);
		
	}else{
		printf("Erro: o índice de leitura da matriz deve ser maior que 0.");
		exit(1);
	}
	
	int lin, col;
	 for(lin  = 0; lin<qtde_linhas; lin++){
		 for(col = 0; col<c; col++){
			 fread(&matriz[lin][col], sizeof(float), 1, arquivo); 			 
		 }
	 }	 
	 fclose(arquivo);
     return matriz;
} 



/**
 * @brief Lê o arquivo contendo uma matriz de floats e retorna a matriz
 * @param l Número de linhas da matriz
 * @param c Número de colunas da matriz 
 * @param nome_arquivo Nome do arquivo a ser lido
 * @author LidianyCS
 */
float **ler_arquivo(int l, int c, char *nome_arquivo){
	FILE *arquivo;
	
	float **matriz;
	
	matriz = alocar_matriz(l, c);
	
	arquivo = fopen(nome_arquivo,"rb");
	if(arquivo == NULL)
      {
        printf("Erro: não foi possível abrir o arquivo para leitura");
        exit(1);
      }        
	 int lin, col;
	 for(lin  = 0; lin<l; lin++){
		 for(col = 0; col<c; col++){
			 fread(&matriz[lin][col], sizeof(float), 1, arquivo); 			 
		 }
	 }	
		        
     fclose(arquivo);
     return matriz;
} 



/**
 * 
 * @brief Cria um arquivo com uma matriz de floats para teste 
 * @param l Número de linhas da matriz a ser criada
 * @param c Número de colunas da matriz a ser criada
 * @param nome_arquivo String com o nome do arquivo a ser criado
 * @author LidianyCS
 *   
 * */
void criar_arquivo_teste(int l, int c, char *nome_arquivo){
	FILE *arquivo;	
	float **matriz;
	int lin, col;
    float x = 0.1;    

	matriz = alocar_matriz(l, c);
	
	arquivo = fopen(nome_arquivo,"w+b");
	if(arquivo == NULL)
      {
        printf("Erro ao abrir arquivo para leitura");
        exit(1);
      }        
	 for(lin  = 0; lin<l; lin++){
		 for(col = 0; col<c; col++){
			 matriz[lin][col] = x;			 
             x++;
             x = x*1.2; 			 
		 }
	 }
	
	 for(lin  = 0; lin<l; lin++){
		 for(col = 0; col<c; col++){
			 fwrite(&matriz[lin][col], sizeof(float), 1, arquivo); 			 
		 }
	 }            
     fclose(arquivo);
}




